<?php
/**
 * 文件处理服务
 * panglishan
 * 2020.07.28
 */

namespace App\Services\Tools;

use App\Exceptions\BasicException;
use Illuminate\Support\Facades\Storage;

//引入存储类
use Log;

class FileService
{

    /**
     * 基础的文件上传方法(OSS存储)
     *
     * @param  null  $file  要存储的文件对象
     * @param  array  $file_type  要上传的所有的文件类型(数组)
     * @param  string  $path  OSS存储位置,一层目录如:admin 二级目录:admin/avatar 以此类推
     * @param  string  $prefix  文件前缀,可空
     * @param  bool|true  $is_strict  是否严格模式,严格模式出现错误直接中断程序运行,抛出错误,非严格模式,出现问题返回false,不中断业务程序执行
     * @return bool|string
     * @throws BasicException
     */
    static function uploadFile($file = null, $file_type = [], $path = 'general', $prefix = '', $is_strict = true)
    {
        if (empty($file)) {
            return self::fileResponse(10050, $is_strict);
        }
        //判断文件是否有效
        if ($file->isValid()) {
            //获取文件信息
            $originalName = $file->getClientOriginalName(); //原始名称
            $ext = $file->getClientOriginalExtension();     //扩展名称
            $type = $file->getClientMimeType();             //文件类型

            if (!empty($file_type)) {
                if (!in_array($type, $file_type)) {
                    return self::fileResponse(10051, $is_strict);
                }
            }
            $realPath = $file->getRealPath();                                                                      //文件地址
            $filename = $prefix . md5(date('YmdHis', time()) . mt_rand(101, 999)) . str_random(5) . '.' . $ext;    //新的文件名
            $target = '/' . $path . '/' . $filename;                                                               //目标地址
            $upload = Storage::disk('oss')->put($target, file_get_contents($realPath));                            //执行存储操作
            //            dd($upload);
            if ($upload) {
                $url = 'http://' . env('OSS_BUCKET') . '.' . env('OSS_ENDPOINT');    //获取bucket地址
                $file_url = $url . $target;

                return $file_url;
            } else {
                //todo:上传失败,记录日志,报警
                return self::fileResponse(10053, $is_strict);
            }
        } else {
            return self::fileResponse(10052, $is_strict);
        }
    }

    /**
     * 文件操作响应
     *
     * @param $code
     * @param  bool|true  $is_strict
     * @return bool
     * @throws BasicException
     */
    static function fileResponse($code, $is_strict = true)
    {
        if ($is_strict) {
            throw new BasicException($code);
        }

        return false;
    }

    /**
     *删除文件 待测试
     *
     * @param $url
     */
    static function delFile($url)
    {
        if (Storage::disk('oss')->exists($url)) {
            throw new BasicException($url + '文件不存在!!!');
        }
        $res = Storage::disk('oss')->delete($url);
        if (!$res) {
            throw new BasicException($url + '删除失败!!!');
        }
    }






}